<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    function Father(uname, age) {
        this.uname = uname;
        this.age = age;
        this.sleep = function () {
            console.log("Father's sleep")
        }
    }

    Father.prototype.money = function () {
        console.log("Father's money")
    };

    function Son(uname, age, school) {
        // 这里借用了call修改Father中的this指向为son对象，从而达到给son赋值属性的目的
        Father.call(this, uname, age);
        this.school = school;
    }


    // 这样继承到Father类中原型对象的方法，而通过call可以继承Father原型类中的实例方法和属性
    Son.prototype.study = function () {
        console.log("Son's study")
    };
    Son.prototype.__proto__ = Father.prototype;  // constructor和实例对象都有原型对象（prototype和__proto___指向的是同一个原型对象），
                                                // 而原型对象也是一个对象，对象都拥有一个原型对象。而prototype中的原型对象__proto__指的就是他的父类的原型对象
    Son.prototype.smile = function () {
        console.log("Son's smile")
    };
    var son = new Son("周文军", 20, "复旦");
    // print(son.uname); // 调用print方法，打印机
    // print(son.age);

    console.log(son.uname);
    console.log(son.age);
    console.log(son);
    console.log(son.__proto__);
    son.money();
    son.study();
    son.sleep();
    son.smile();
    console.log(Father.prototype)
    console.log(son);

    console.log("================================老师的继承");
    // Son.prototype = Father.prototype;  这样直接赋值会有问题,如果修改了子原型对象,父原型对象也会跟着一起变化
    Son.prototype = new Father(); //这样存在问题，每次继承的原型对象中的方法，都会是father中的实例方法，虽然能做到后面的都共享，
                                // 但是每次都会new一个Father对象。并且新添加的方法只可能在new操作后面执行。
                                // 这种继承方式的另一个缺陷就是Father中的成员变量 name,age会以undefined的形式存在在Son的prototype中
    // 如果利用对象的形式修改了原型对象,别忘了利用constructor 指回原来的构造函数 !!!!!!!
    Son.prototype.constructor = Son;
    // 这个是子构造函数专门的方法
    Son.prototype.exam = function() {
        console.log('孩子要考试');
    };
    var son2 = new Son('刘德华', 18, 100);
    console.log(son2);
    son2.exam();
    console.log(Father.prototype);
    console.log(Son.prototype.constructor);

    var son3 = new Son('张学友', 18, 100);
    son3.exam()

</script>

</body>
</html>